home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / WC_WaveShape.cpp < prev    next >
C/C++ Source or Header  |  1999-08-15  |  6KB  |  202 lines

  1. #include "WC_WaveShape.h"
  2.  
  3. #include "ArgList.h"
  4.  
  5. WC_WaveShape::WC_WaveShape() {
  6.     mPrefWidth = 1;
  7.     mPrefHeight = 1;
  8. }
  9.  
  10.  
  11. #define _assignOrig( field )  field##Orig = field;
  12.  
  13.  
  14.  
  15. void WC_WaveShape::Assign( const ArgList& inArgs, ExpressionDict& ioDict ) {
  16.     UtilStr str;
  17.  
  18.     
  19.     // Extract, compile, and link in order
  20.     mA_Var.Compile( inArgs, 'A', ioDict );        mA_Var.Evaluate();        // The "a"'s are done once per load
  21.     mB_Var.Compile( inArgs, 'B', ioDict );
  22.     mC_Var.Compile( inArgs, 'C', ioDict );
  23.     mD_Var.Compile( inArgs, 'D', ioDict );
  24.     
  25.     
  26.     inArgs.GetArg( 'X', str );    mX.Compile( str, ioDict );
  27.     inArgs.GetArg( 'Y', str );    mY.Compile( str, ioDict );
  28.     inArgs.GetArg( 'Z', str );    mZ.Compile( str, ioDict );
  29.         
  30.     // Set some basic params
  31.     mBlurVal            = inArgs.GetArg( 'BlrB' );
  32.     mNumBlurs            = inArgs.GetArg( 'Blrs' );
  33.     mSampleDelay        = inArgs.GetArg( 'Resn' );
  34.     mConnectSamples        = inArgs.GetArg( 'ConL' );
  35.     mConnectBins        = inArgs.GetArg( 'ConB' );
  36.     mConnectFirstLast    = inArgs.GetArg( 'ConB' ) > 1;
  37.     mCanIncreaseScale    = inArgs.GetArg( 'ScSz' );
  38.     
  39.     // Change sample expiration/duration from secs to ticks
  40.     mSampleDuration        = 1000.0 * inArgs.GetFloat( 'Durn' );
  41.  
  42.     // Know the preferred X to Y ratio
  43.     mConfigScale        = mXYScale = inArgs.GetArg( 'Scal' );
  44.     mPrefWidth            = inArgs.GetArg( 'widt' );
  45.     mPrefHeight            = inArgs.GetArg( 'heig' );
  46.     mPerspectiveInt        = inArgs.GetFloat( 'Pers' );
  47.     mFalloff            = inArgs.GetFloat( 'Fall' );
  48.  
  49.     
  50.     // Help make up for the fact that winamp and macamp give us differend data
  51.     #if EG_WIN
  52.     mFalloff *= 0.82;
  53.     #endif    
  54.  
  55.     // How many steps of s from 0 to 1
  56.     mNum_S_Steps = inArgs.GetArg( 'Stps' );
  57.     if ( mNum_S_Steps < 1 )
  58.         mNum_S_Steps = NUM_SAMPLE_BINS;
  59.     if ( mNum_S_Steps > NUM_SAMPLE_BINS )
  60.         mNum_S_Steps = NUM_SAMPLE_BINS;
  61.  
  62.     // Read and compile the camera xyz pos, dir, and angle exprs
  63.     inArgs.GetArg( 'CamX', str );    mCamX.Compile( str, ioDict );
  64.     inArgs.GetArg( 'CamY', str );    mCamY.Compile( str, ioDict );
  65.     inArgs.GetArg( 'CamZ', str );    mCamZ.Compile( str, ioDict );
  66.     inArgs.GetArg( 'CmLX', str );    mCamLX.Compile( str, ioDict );
  67.     inArgs.GetArg( 'CmLY', str );    mCamLY.Compile( str, ioDict );
  68.     inArgs.GetArg( 'CmLZ', str );    mCamLZ.Compile( str, ioDict );
  69.     inArgs.GetArg( 'CUpX', str );    mCamUpX.Compile( str, ioDict );
  70.     inArgs.GetArg( 'CUpY', str );    mCamUpY.Compile( str, ioDict );
  71.     inArgs.GetArg( 'CUpZ', str );    mCamUpZ.Compile( str, ioDict );
  72.     
  73.     inArgs.GetArg( 'LWdt', str );
  74.     if ( str.length() == 0 )
  75.         str.Assign( "1" );
  76.     mLineWidth.Compile( str, ioDict );
  77.     
  78.     // Read and compile color expressions
  79.     inArgs.GetArg( 'R', str );    mR.Compile( str, ioDict );
  80.     inArgs.GetArg( 'G', str );    mG.Compile( str, ioDict );
  81.     inArgs.GetArg( 'B', str );    mB.Compile( str, ioDict );
  82.     if ( inArgs.ArgExists( 'LvlR' ) ) {
  83.         inArgs.GetArg( 'LvlR', str ); mLvlR.Compile( str, ioDict );
  84.         inArgs.GetArg( 'LvlG', str ); mLvlG.Compile( str, ioDict );
  85.         inArgs.GetArg( 'LvlB', str ); mLvlB.Compile( str, ioDict ); }
  86.     else {
  87.         mLvlR.Assign( mR );
  88.         mLvlG.Assign( mG );
  89.         mLvlB.Assign( mB );        
  90.     }
  91.     
  92.     inArgs.GetArg( 'BckR', str );    mBackR.Compile( str, ioDict );
  93.     inArgs.GetArg( 'BckG', str );    mBackG.Compile( str, ioDict );
  94.     inArgs.GetArg( 'BckB', str );    mBackB.Compile( str, ioDict );
  95.  
  96.     mX_Dep_S = mX.IsDependent( "s" ) || mX.IsDependent( "d" );
  97.     mY_Dep_S = mY.IsDependent( "s" ) || mY.IsDependent( "d" );
  98.     mZ_Dep_S = mZ.IsDependent( "s" ) || mZ.IsDependent( "d" );
  99.  
  100.     mR_Dep_S = mR.IsDependent( "s" ) || mR.IsDependent( "d" );
  101.     mG_Dep_S = mG.IsDependent( "s" ) || mG.IsDependent( "d" );
  102.     mB_Dep_S = mB.IsDependent( "s" ) || mB.IsDependent( "d" );
  103.     
  104.     // Make copies of the original values
  105.     _assignOrig( mSampleDuration )
  106.     _assignOrig( mSampleDelay )
  107.     _assignOrig( mFalloff )
  108.     _assignOrig( mNumBlurs )
  109.     _assignOrig( mBlurVal )
  110.     _assignOrig( mPerspectiveInt )
  111.     _assignOrig( mXYScale )
  112.     _assignOrig( mNum_S_Steps )
  113.     _assignOrig( mConnectBins )
  114.     _assignOrig( mConnectSamples )
  115.     _assignOrig( mConnectFirstLast )
  116. }
  117.  
  118.  
  119.  
  120.  
  121. void WC_WaveShape::SetScaleToFit( long inWidth, long inHeight ) {
  122.     float s1, s2;
  123.             
  124.     s1 = mConfigScale * inWidth / mPrefWidth;
  125.     s2 = mConfigScale * inHeight / mPrefHeight; 
  126.     if ( s2 < s1 )
  127.         s1 = s2;
  128.     if ( ! mCanIncreaseScale && s1 > mConfigScale )
  129.         mXYScaleOrig = mConfigScale;
  130.     else
  131.         mXYScaleOrig = s1;
  132.         
  133.     mXYScale = mXYScaleOrig;
  134. }
  135.  
  136.  
  137. void WC_WaveShape::SetupTransition( WC_WaveShape* inDest, float* inTLink ) {
  138.  
  139.     mX.Weight( inDest -> mX, inTLink );
  140.     mY.Weight( inDest -> mY, inTLink );
  141.     mZ.Weight( inDest -> mZ, inTLink );
  142.     
  143.     mCamX.Weight( inDest -> mCamX, inTLink );
  144.     mCamY.Weight( inDest -> mCamY, inTLink );    
  145.     mCamZ.Weight( inDest -> mCamZ, inTLink );
  146.     
  147.     mCamLX.Weight( inDest -> mCamLX, inTLink );
  148.     mCamLY.Weight( inDest -> mCamLY, inTLink );
  149.     mCamLZ.Weight( inDest -> mCamLZ, inTLink );
  150.  
  151.     mCamUpX.Weight( inDest -> mCamUpX, inTLink );
  152.     mCamUpY.Weight( inDest -> mCamUpY, inTLink );
  153.     mCamUpZ.Weight( inDest -> mCamUpZ, inTLink );
  154.     
  155.     mR.Weight( inDest -> mR, inTLink );
  156.     mG.Weight( inDest -> mG, inTLink );
  157.     mB.Weight( inDest -> mB, inTLink );
  158.     
  159.     mLvlR.Weight( inDest -> mLvlR, inTLink );
  160.     mLvlG.Weight( inDest -> mLvlG, inTLink );
  161.     mLvlB.Weight( inDest -> mLvlB, inTLink );
  162.  
  163.     mBackR.Weight( inDest -> mBackR, inTLink );
  164.     mBackG.Weight( inDest -> mBackG, inTLink );
  165.     mBackB.Weight( inDest -> mBackB, inTLink );
  166.         
  167.     mX_Dep_S = mX_Dep_S || inDest -> mX_Dep_S;
  168.     mY_Dep_S = mY_Dep_S || inDest -> mY_Dep_S;
  169.     mZ_Dep_S = mZ_Dep_S || inDest -> mZ_Dep_S;
  170.  
  171.     mR_Dep_S = mR_Dep_S || inDest -> mR_Dep_S;
  172.     mG_Dep_S = mG_Dep_S || inDest -> mG_Dep_S;
  173.     mB_Dep_S = mB_Dep_S || inDest -> mB_Dep_S;
  174.     
  175.     mLineWidth.Weight( inDest -> mLineWidth, inTLink );
  176.     
  177. }
  178.  
  179.  
  180.  
  181. #define __weightFLT( field ) field = ( inW * ( (float) field##Orig ) + w1 * ( (float) inDest -> field ) );
  182. #define __weightINT( field ) field = ( 0.5 + inW * ( (float) field##Orig ) + w1 * ( (float) inDest -> field ) );
  183. #define __weightBOL( field ) field = .5 < ( inW * ( field##Orig ? 1.0 : 0.0 ) + w1 * ( inDest -> field ? 1.0 : 0.0 ) );
  184.  
  185. void WC_WaveShape::SetupFrame( WC_WaveShape* inDest, float inW ) {
  186.     float w1 = 1.0 - inW;
  187.         
  188.     __weightINT( mSampleDuration )
  189.     __weightINT( mSampleDelay )
  190.     __weightFLT( mFalloff )
  191.     __weightINT( mNumBlurs )
  192.     __weightINT( mBlurVal )
  193.     __weightFLT( mPerspectiveInt )
  194.     __weightFLT( mXYScale )
  195.     __weightINT( mNum_S_Steps )
  196.     __weightBOL( mConnectBins )
  197.     __weightBOL( mConnectSamples )
  198.     __weightBOL( mConnectFirstLast )
  199. }
  200.  
  201.  
  202.